#ifndef _KYLIN_ACTIVATION_H_
#define _KYLIN_ACTIVATION_H_


#define NO_ERROR 0
#define LICENSE_VERIFY_ERROR 1		// 无LICENSE文件或LICENSE文件无法通过签名验证
#define LICENSE_DATA_FORMAT_ERROR 2	// LICENSE文件内容格式错误
#define LICENSE_SERIAL_ERROR 3		// LICENSE文件没有序列号
#define KYINFO_ERROR 4			// 无有效的麒麟信息文件
#define REGISTER_CREATION_ERROR 5	// 注册码生成失败
#define REGISTER_DEAL_HYPHEN_ERROR 6	// 注册码处理失败
#define QRCODE_CREATION_ERROR 7		// 二维码字符串生成失败
#define ACT_CODE_DEAL_HYPHEN_ERROR 8	// 激活码处理失败
#define INVALID_ACT_CODE 9		// 无效的激活码
#define ACT_CODE_HAS_EXPIRED 10		// 激活码所包含到期时间已过期
#define ACT_EXPIRE_EARLIER_THAN_TRIAL 11	// 激活码包含的到期时间早于试用期到期时间
#define ACT_EXPIRE_EARLIER_THAN_ORIGINAL 12	// 激活码包含的到期时间早于系统已有激活码到期时间
#define ACT_CODE_SAVE_ERROR 13		// 激活码保存失败，程序可能不是root用户权限执行的，程序需要以root用户权限执行。或者文件系统只读
#define NO_VALID_PUBLIC_KEY 14		// 无有效的公钥。这个很有可能是系统时间不对导致的。
#define SYSTEM_TIME_ERROR   15		// 系统时间有问题。
#define GPGME_INITIALIZATION_ERROR 16	// gpgme初始化失败
#define HARDWARE_INFORMATION_ERROR 17	// 在不同的情况下，由不同的含义。例如在获取注册码时，为“无法生成注册码”；在激活时，为“无法进行激活”；在查询激活状态时，为“无法获取激活状态”。
#define LICENSE_NO_CLASS_ERROR 18
#define LICENSE_CLASS_MATCH_ERROR 19
#define NO_UKEY_FOUND 20
#define UKEY_LOGIN_ERROR 21
#define UKEY_GET_DATA_ERROR 22
#define UKEY_GET_HID_ERROR 23
#define UKEY_KEY_FILE_ERROR 24
#define UKEY_NO_SERIAL 25
#define UKEY_NO_EXPIRE_TIME 26
#define UKEY_MODULE_COUNT_ERROR 27
#define UKEY_MODULE_CHECK_ERROR 28
#define UKEY_MODULE_DECREASE_ERROR 29
#define UKEY_MODULE_NO_MORE_COUNT 30
#define UKEY_SPACE_FULL 31
#define UKEY_MODULE_IS_ZERO 32
#define UKEY_MODULE_CANNOT_REDUCE 33
#define UKEY_WRITE_DATA_ERROR 34
#define INVALID_REGISTER_CODE 35
#define UKEY_LOGOFF_ERROR 36
#define UKEY_LIBRARY_LOAD_ERROR 37
#define SERIAL_NUMBER_MATCH_ERROR 38
#define UKEY_EXPIRE_DEAL_HYPHEN_ERROR 39
#define UKEY_ACTIVATE_SYSTEM_FAILED 40
#define HAS_NORMALLY_ACTIVATED 41
#define HAS_ACTIVATED_WITH_ANOTHER_UKEY 42
#define UKEY_INIT_ERROR 43
#define UKEY_CONTENT_ERROR 44
#define GPGME_ENCRYPT_ERROR 45
#define INVALID_SIGNATURE 46
#define NON_KYLIN_PACKAGE 47
#define MODIFIED_FILE_ERROR 48

#define LICENSE_LOAD_ERROR 49
#define SIGSUM_RED_ERROR 50
#define BAD_SIGNATURE_ERROR 51
#define SIGNATURE_STATUS_ERROR 52
#define LICENSE_NO_SIGNATURE 53

#define NON_KYLIN_PACKAGE 47
#define MODIFIED_FILE_ERROR 48

#define LICENSE_LOAD_ERROR 49
#define SIGSUM_RED_ERROR 50
#define BAD_SIGNATURE_ERROR 51
#define SIGNATURE_STATUS_ERROR 52
#define LICENSE_NO_SIGNATURE 53

#define LICENSE_STRING_LOAD_ERROR 54
#define LICENSE_STRING_VERIFY_ERROR 55
#define LICENSE_CHECKSUM_ERROR 56
#define LICENSE_NO_VERSION_ERROR 57
#define LICENSE_NO_PLATFORM_ERROR 58

#define BASE64_LENGTH_ERROR 59
#define BASE64_CHAR_ERROR 60
#define BASE64_ENDING_ERROR 61
#define BASE64_ENCODE_ERROR 62
#define BASE64_DECODE_ERROR 63
#define TRANSFORM_CHAR_ERROR 64
#define TRANSFORM_FROM_URL_ERROR 65
#define TRANSFORM_PARSE_ERROR 66
#define TRANSFORM_TO_URL_ERROR 67
#define SSL_ENCRYPT_ERROR 68
#define SSL_DECRYPT_ERROR 69
#define INFO_ENCRYPT_ERROR 70
#define INFO_DECRYPT_ERROR 71
#define SERIAL_NUMBER_VALIDATION_ERROR 72
#define NO_SERIAL_NUMBER_ERROR 73
#define INVALID_OVERWRITE_SERIAL_NUMBER_ERROR 74

#define LICENSE_SERIAL_NUMBER_VALIDATION_ERROR 75
#define UKEY_SERIAL_NUMBER_VALIDATION_ERROR 76
#define PRODUCT_TYPE_MATCH_ERROR 77

#define LICENSE_PLATFORM_MATCH_ERROR 78

#define PRODUCE_NUMBER_MATCH_ERROR 79

#define ACTIVATION_SERIAL_NUMBER_MATCH_ERROR 80
#define SYSTEM_VERSION_INFORMATION_MATCH_ERROR 81
#define LICENSE_DETECTION_FAIL 82

#define OTHER_ERROR 100

#define UKEY_ENUM_APP_ERROR 110
#define UKEY_OPEN_APP_ERROR 111 
#define UKEY_GET_DEVINFO_ERROR 112
#define UKEY_USERPIN_VERIFY_ERROR 113
#define UKEY_ENUM_FILES_ERROR 114


char* kylin_activation_get_register_number_with_serial(const char* serial_no, int* result);
char* kylin_activation_get_qrcode_with_serial(const char* serial_no, int* result);
/*
   上面两个函数，需要传入服务序列号，执行成功时返回对应的字符串，result值为NO_ERROR；
   否则返回NULL，并且在传入的result中置入相应错误。
*/

char* kylin_activation_get_serial_number(int* result);
char* kylin_activation_get_register_number(int* result);
char* kylin_activation_get_qrcode(int* result);
char* kylin_activation_get_hardware_info(int* result);
char* kylin_activation_get_encrypted_hardware_info(int* result);
/* 
   上面5个函数，执行成功时返回对应的字符串，result值为NO_ERROR；
   否则返回NULL，并且在传入的result中置入相应错误。
   例如：
	{
		int res;
		char* serial_no;

		serial_no = kylin_activation_get_serial_number(&res);
	}
   若此时出现错误，serial_no为NULL，res的值为对应错误

*/

char* kylin_activation_get_expire_date(int* result);
/*
   返回值和result与上面3个函数类似，但是在系统处于未激活状态下，返回值也为NULL
*/

char* kylin_activation_get_old_expire_date(int* result);
/*
   返回值和result与上面几个函数类似。
   系统处于未激活状态下时，返回值不为NULL，则表明系统已经过期；同样的情况下，若返回值为NULL，则表明系统未被激活过。
   系统处于激活状态下时，该函数返回值与kylin_activation_get_expire_date一致。
*/


int kylin_activation_activate_system_with_serial(const char* serial_no, const char* activate_number);
int kylin_activation_activate_system(const char* activate_number);
/*
   激活成功时，返回值为NO_ERROR；否则返回对应错误。
*/

int kylin_activation_activate_status(int * result);
/*
   检查系统激活状态，若出现错误，result会设置为对应的错误值
   函数返回值表示激活状态，0表示未激活，1表示已激活。
*/

int kylin_activation_trial_status(int* result);
/*
   检查系统是否在试用期内，若出现错误，result会设置为对应的错误值
   函数返回值表示是否在试用期内，0表示已过试用期，1表示在试用期内。
*/


char* kylin_activation_get_result_message(int result);
/*
   返回result值对应的结果信息字符串
 */ 

int kylin_activation_can_set_serial_number(int *result);
/*
 * 检查是否可以修改服务序列号，若出现错误，result会设置为对应的错误值；
 * 函数返回值表示表示是否可以修改服务序列号，1表示可以，0表示不可以。
 */

char* kylin_activation_get_customer(int* result);
/*
   获取客户信息，若出现错误，result会设置为对应的错误值
*/

int kylin_activation_set_customer(const char* customer);
/*
   设置客户信息，若出现错误，返回值为0表示成功，否则返回错误类型。
*/

char* kylin_activation_get_vendor();//获取厂商名称
char* kylin_activation_get_model();//获取机型信息biosid(Dell)
char* kylin_activation_get_service_tag();//获取机器序列号
int kylin_activation_check_oem();//检查是否是oem环境
int kylin_activation_license_check(const char* l_file, const char* i_file);//license检查
char* kylin_activation_get_trial_date(int* result);//获取试用期
int kylin_activation_find_ukey(int* result);//查找ukey
void kylin_activation_print_result_message(int result);//返回码解析接口

#endif
